/**
 * 项目名称: 顺序队列.cpp
 * 项目路径: study/DataStructure/数据结构/队列/顺序队列模板
 * 编辑时间: 2024年07月16日08时18分51秒
 * 用   户: 轻尘
 */

#include <bits/stdc++.h>

using namespace std;

#define MaxSize 10

struct SqQueue{
    int data[MaxSize];
    int front;// 队头指针
    int rear;// 队尾指针
};

/**
 * 初始化队列
 * @param Q
 */
void InitQueue(SqQueue &Q){
    Q.front = Q.rear = 0; // 初始时 队头,队尾指针指向0
}

/**
 * 判断队列是否为空
 * @param Q
 * @return
 */
bool QueueEmpty(SqQueue Q){
    return Q.rear == Q.front;
}

/**
 * 入队
 * 通过构建循环队列的方式,方便判断队是否已满
 * 入队,队尾指针后移
 * @param Q
 * @param x
 * @return
 */
bool EnQueue(SqQueue &Q,int x){
    if((Q.rear + 1)%MaxSize == Q.front)return false; // 队满返回false
    Q.data[Q.rear] = x;// 新元素插入队尾
    Q.rear = (Q.rear + 1)%MaxSize;// 队尾指针加 1 取模
    return true;
}

/**
 * 出队
 * 队头元素出队,队头指针右移
 * @param Q
 * @param x
 * @return
 */
bool DeQueue(SqQueue &Q,int &x){
    if(Q.rear == Q.front)return false; // 队空返回false
    x = Q.data[Q.front];
    Q.front = (Q.front + 1)%MaxSize;
    return true;
}

/**
 * 获取队头元素
 * @param Q
 * @param x
 * @return
 */
bool GetHead(SqQueue Q,int &x){
    if(Q.front == Q.rear)return false;
    x=Q.data[Q.front];
    return true;
}
int main() {
    SqQueue qp;
    InitQueue(qp);
    EnQueue(qp,1);
    EnQueue(qp,2);
    EnQueue(qp,3);
    EnQueue(qp,4);
    EnQueue(qp,5);
    while (!QueueEmpty(qp)){
        int x = 0;
        DeQueue(qp,x);
        cout<<"X值为: "<<x;
    }
    return 0;
}
